package com.example.demo.pattern.proxy.dynamics;

import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 动态代理  接口动态代理
 */
@Slf4j
public class JdkProxy<T> implements InvocationHandler {

    /**
     * 目标对象
     */
    private T target;

    /**
     * 绑定关系，也就是关联到哪个接口（与具体的实现类绑定）的哪些方法将被调用时，执行invoke方法。
     *
     * @param target 绑定具体的代理实例
     * @return 动态代理类实例
     */
    public JdkProxy(T target) {
        this.target = target;
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("start...");
        Object result = method.invoke(target, args);
        System.out.println("end...");
        return result;
    }
}
